#============================================
# #知识点 
# 定义一张员工表表中有很多字段
# id   name   gender   dep_name       dep_desc
                                 # 外键（链接部门表）
# 1该表的组织结构不是很清晰(可忽视)
# 2浪费硬盘空间(可忽视)
# 3数据的扩展性极差(无法忽视的)
#如何优化?
# 上述问题就类似于你将所有的代码都写在了一个py文件中
# 将员工表拆分员工表和部门表

#外键
#用来帮我建立表与表之间的关系
#foregin key 外键
#============================================
# 表关系：
#一对多，多对多，多对一，没有关系
#============================================
# 一对多关系
# foreign key
# 1、一对多表关系，外键字段建立在多的表中
# 2、必须先创建被关联的表
# 3、录入数据时，必须先录入被关联表

# 在确定表与表之间关系的时候十定要换位思考
# 先站在员工表考虑
# 员工表里面的一个员工能否对应部门表里面的多个部门  不能!
# 再站在部门表考虑
# 部门表里面的一个部]能否对应员工表里面的多个员工   可以!
# 结论:员工表与部门表只是单向的一对多成立，那么员工表和部门表就是(一对多)表关系!!!

# sql语句
#创建部门表
#create table bm(id int primary key auto_crement,dep_name varchar,dep_desc vachar);
#创建员工表
# create table yg(
#         id int primary key auto_increment,
#         name varchar,
#         gender enum("mela","famela") default "mela",
#         age int,
#         dep_id int,
#         foreign key(dep_id) references bm(id)
#         on update cascade   #同步更行
#         on delete cascade   #同步删除
#         );

#这里删除与更新都是同步的。

#需要记得单词
#主键 primary key
#外键 foreign key
#外键链接 references
#同步更行删除 cascade
#自动更新id auto_increment
#默认情况 default
#============================================
#多对多关系 
#得创建三个表
#第三个表是俩个表之间的关系
#俩个表之间座删除，更新操作不会影响彼此，只会影响第三张表
# create table bk(id int primary key auto_increment,name varchar(16),price int);

# create table writer(id int primary key auto_increment,name varchar(16),gender enum("mela","fmela","others") default "mela");

# create table bkorw(
#             id int primary key auto_increment,
#             bkid int,
#             writerid int,
#             foreign key(bkid) references bk(id) 
#             on update cascade 
#             on delete cascade,
#             foreign key(writerid) references writer(id) 
#             on update cascade 
#             on delete cascade
#             );
#============================================
#多对一关系
#mysql没有这一说，都叫一对多关系。
#============================================
#一对一关系
# 使用场景
# qq的表面和详情面，拆开，减少数据传输量
# 俩个表都可以加外键，建议加在频繁点击的那个表
# 用法就是在一对多的外键上加一个唯一约束unique
# create table qq_detil(
#     id int primary key auto_increment,
#     addr varchar(60),
#     birthday datetime
#     );



# create table qq(
#     id int primary key auto_increment,
#     name varchar(60),
#     gender enum("mela","fmela","others") default "mela",
#     detil_id int unique,
#     foreign key(detil_id) references qq_detil(id)
#     on update cascade
#     on delete cascade
#     );
#============================================
# 表关系的建立需要用到foreign key
# 一对多
# 外键字段建在多的一方
# 多对多
# 自己开设第三张存储
# 一对一 
# 建在任意一方都可以但是推荐你建在查询频率较高的表中

# 判断表之间关系的方式
# 换位思考!
# 员工与部门
# 图书与作者
# 作者与作者详情
#============================================
# 修改表(了解)
# 1修改表名
# alter table 表名 rename 新表名;
# 2增加字段
# alter tab1e 表名 add 字段名 字段类型(宽度) 约束条件;
# alter table 表名 add 字段名 字段类型(宽度) 约束条件 first;
# alter tab1e 表名 add 字段名 字段类型(宽度) 约束条件 after 字段名;
# 3删除字段
# alter table 表名 drop 字段名;
# 4修改字段
# alter table 表名 modify 字段名 字段类型(宽度) 约束条件;
# alter table 表名 change 旧字段名 新字段名 字段类型(宽度) 约束条件;
#============================================
# 复制表(了解)
# 我们sql语句查询的结果其实也是一张虚拟表
# create tab1e 表名 select * from 旧表 where 条件;    不  能复制主键 外键
#============================================
# 表与表之间如果有关系的话可以有两种建立联系的方式
# 1.就是通过外键强制性的建立关系
# 2.就是自已通过sq1语句逻辑层面上建立关系
# delete from emp where id=1;
# delete from dep where id=1;
# 创建外键会消耗一定的资源并且增加了表与表之间的耦合度
# 在实际项目中如果表特别多其实可以不做任何外键处理直接
# 通过sq1语句来建立逻辑层面上的关系
#============================================
